//
// Created by wujehy on 2020/8/4.
//

#ifndef AUTH_RAFT_USERDB_H
#define AUTH_RAFT_USERDB_H

#include <vector>
#include <cstdint>
#include <string>
#include "DaoBase.h"
#include "SQLiteCpp/Database.h"

/**
 * @brief 用户信息数据类型
 */
struct UserDataType
{
    int64_t uid;
    std::string username;
    std::string password;
    std::string email;
    int64_t createat;
    int64_t modifyat;
};

/**
 * @brief 实现的 用户数据库模块 sqlite 的实现
 */
class UserDB : public DaoBase<void, SQLite::Database>
{
public:
    /**
     * @brief 当前模块的类型
     * @return 返回 user mod
     */
    int type() override;

    /**
     * @brief 初始化
     * @return
     */
    int init() override;

    /**
     * @brief 添加一个用户
     * @param user 用户信息 表结构
     * @param userdata 用户数据指针
     * @return
     */
    int add_user(UserDataType &user, void *userdata = nullptr);

    /**
     * @brief 添加多个 用户信息
     * @param users
     * @param userdata
     * @return
     */
    int add_users(std::vector<UserDataType> &users, void *userdata = nullptr);

    // TODO 暂时未优化
    int delete_user(UserDataType &user, void *userdata = nullptr);

    int delete_users(std::vector<UserDataType> &users, void *userdata = nullptr);

    int find_user(std::vector<UserDataType> &users, void *userdata = nullptr);

    // 直接诶使用旧的

    /**
   * @brief 添加一个用户
   * @param username
   * @param passwordSrc
   * @param email
   * @return
   */
    int insertUser(std::string &username, std::string &passwordMd5, std::string &email);

    /**
     * @brief 判断用户是否可以
     * @param username
     * @param passwordmd5
     * @param email
     * @return
     */
    int checktUser(std::string &username, std::string &passwordmd5, std::string email = "");

    /**
     * @brief 判断用户是否存在
     * @param username
     * @return
     */
    int existUser(std::string &username);

    int addUser(std::string &username, std::string &passwordMd5, std::string &email);

    int updataPassword(std::string &username, std::string &oldpasswordMd5, std::string &newPasswordMd5);

    int changePassword(std::string &username, std::string &newPassword);

    int64_t getUidByUsername(std::string &username);

    void init_finished() override;
};


#endif //AUTH_RAFT_USERDB_H
